#include <vcl\vcl.h>
#include <VCL\BDE.hpp>
#include <EIC.h>
#pragma hdrstop

#include "Compta.hrc" // Ressources
#include "uCrMoCpt.h"

#pragma package(smart_init)
#pragma link "CEdit"
#pragma link "CEditCpt"
#pragma link "CCheckB"
#pragma link "CBitBtn"
#pragma link "CTable"
#pragma resource "*.dfm"
#define MODULE_TAG 1002

TMiseAjourDesTiers CM_MiseAJourDesTiers = NULL;

bool __fastcall DlgCreerCompte(bool bModifier,TTablePC *ptblPC,const AnsiString &strCompte)
{
  TdlgModCreCpt *pdlgCreerCompte = 0;
  bool bCreated = false;
  try
    {
      pdlgCreerCompte = new TdlgModCreCpt(bModifier,ptblPC,strCompte);
      bCreated = pdlgCreerCompte->ShowModal() == mrOk;
    }
  catch (Exception& e)
    {
      EICDisplayException(TAGL,e);
    }
  if (pdlgCreerCompte)
    delete pdlgCreerCompte;
  return bCreated;
}



bool __fastcall DlgCreerCompte(TTablePC *ptblPC,const CCompte &cpt)
{
  TdlgModCreCpt *pdlgCreerCompte = 0;
  bool bCreated = false;
  try
    {
      pdlgCreerCompte = new TdlgModCreCpt(ptblPC,cpt);
      bCreated = pdlgCreerCompte->ShowModal() == mrOk;
    }
  catch (Exception& e)
    {
      EICDisplayException(TAGL,e);
    }
  if (pdlgCreerCompte)
    delete pdlgCreerCompte;
  return bCreated;
}



/******************************************************************************\
************* TdlgModCreCpt::TdlgModCreCpt() ***********************************
********************************************************************************
*                                                                              *
*    Constructeur du dialogue de création d'un nouveau compte.                 *
*                                                                              *
* Paramètres :                                                                 *
*   bModifier : TRUE pour modifier le compte strCompte dans ptblPC; FALSE pour *
*               en créer un nouveau.                                           *
*   ptblPC    : PC (ouvert) dans lequel créer le compte.                       *
*   strCompte : En création de journal, si ce compte est vide, le dialogue     *
*               demande à le saisir sinon (s'il est non vide) l'utilisateur ne *
*               peut pas modifier ce compte (il doit seulement compléter les   *
*               attributs du compte); sinon, en modification de compte, ce     *
*               paramètre indique le compte -OBLIGATOIREMENT EXISTANT- à       *
*               modifier.                                                      *
\******************************************************************************/
__fastcall TdlgModCreCpt::TdlgModCreCpt(bool bModifier,TTablePC *ptblPC,const AnsiString &strCompte) : CForm(hwndFenetreEICShell)
{
 ASSERT(ptblPC);
 ASSERT(ptblPC->Active);
 ASSERT( !ptblPC->Filtered || ptblPC->Filter.Pos( szfPC_TypeEnr"=0"));

 m_ptblPC    = ptblPC;
 m_bModifier = bModifier;
 if( bModifier)
 { // On veut modifier le compte passé en paramètre
   ASSERT(edcptCompte->ReadOnly);
   ASSERT(!edcptCompte->TabStop);

   if( !ptblPC->GetCompte( strCompte, m_cpt))
   { // Erreur: Le compte à modifier n'existe pas !!
     EICThrowInvalidArgument( TAG( 10));
   }

   ASSERT( m_cpt.Compte == strCompte);
   
   Caption       = "Modification d'un compte";
   btOk->Caption = "&Modifier";
 }
 else if( strCompte.IsEmpty())
 { // On veut créer un nouveau compte (avec un nouveau n°)
   ASSERT(m_cpt.Compte.IsEmpty());
   ASSERT(edcptCompte->Compte.IsEmpty());
   ASSERT(!m_cpt.EstMouvementeNm1);
   ASSERT(!m_cpt.EstMouvementeNm2);

   edcptCompte->ReadOnly = false;
   edcptCompte->TabStop  = true;
 }
 else
 { // Le n° du compte à créer est déjà initialisé
   m_cpt.Compte        = strCompte;
   edcptCompte->Compte = strCompte;

   ASSERT(edcptCompte->ReadOnly);
   ASSERT(!edcptCompte->TabStop);
 }
} /* TdlgModCreCpt::TdlgModCreCpt() */



__fastcall TdlgModCreCpt::TdlgModCreCpt(TTablePC *ptblPC,const CCompte &cpt) : CForm(hwndFenetreEICShell)
{
  ASSERT(ptblPC);
  ASSERT(ptblPC->Active);
  ASSERT( !ptblPC->Filtered || ptblPC->Filter.Pos( szfPC_TypeEnr"=0"));

  m_ptblPC    = ptblPC;
  m_bModifier = false;
  m_cpt = cpt;
  edcptCompte->Compte = cpt.Compte;
  edCompteAbrege->Text = cpt.CompteAbrege;
  if( !cpt.Intitule.IsEmpty())
  {
    DataModified = true;
    edIntitule->Text = cpt.Intitule;
  }

  ASSERT(edcptCompte->ReadOnly);
  ASSERT(!edcptCompte->TabStop);
}



void __fastcall TdlgModCreCpt::DoDataExchange( CDataExchange* pdx)
{
 AnsiString strTmp;  // Variable temporaire

 ASSERT( pdx);

 m_cpt.Compte       = DDX_Text(        pdx, edcptCompte,       strTmp = m_cpt.Compte);
                      DDV_StrNotEmpty( pdx,                    strTmp);
 m_cpt.Intitule     = DDX_Text(        pdx, edIntitule,        strTmp = m_cpt.Intitule);
                      DDV_StrNotEmpty( pdx,                    strTmp);
 m_cpt.IntituleLong = DDX_Text(        pdx, edIntituleLong,    strTmp = m_cpt.IntituleLong);
                      chkRANDetaille->Checked    = m_cpt.RANDetaille;
                      chkSaisiePeriodes->Checked = m_cpt.SaisiePeriodes;
                      DDX_IsChecked(   pdx, chkSupprime,       m_cpt.Supprime);
 m_cpt.CompteAbrege = DDX_Text(        pdx, edCompteAbrege,    strTmp = m_cpt.CompteAbrege);

 // En création d'un nouveau compte ou modification de compte,
 // le n° de compte ne peut être vide
 ASSERT( !( edcptCompte->ReadOnly && edcptCompte->Compte.IsEmpty()));

 edcptCompteChange(0);
}



/******************************************************************************\
************* TdlgModCreCpt::FormCloseQuery() ********************************
********************************************************************************
*                                                                              *
*    Cette procédure permet, au moment ou l'utilisateur annule sa saisie, de   *
* lui demander une confirmation d'abandon. L'annulation de la saisie est       *
* réalisée via le bouton "Annuler" (ModalResult = mrCancel) ou via le menu (ou *
* l'icône) système "Fermeture". Lorsque cette procédure est appellée pour      *
* fermer le dialogue suite à une validation de la saisie (via le bouton "Créer"*
* (ModalResult = mrOk)), la demande de confirmation d'annulation n'est pas     *
* réalisée.                                                                    *
*                                                                              *
* Paramètres :                                                                 *
*   pSender   : La fiche elle-même.                                            *
*   bCanClose : FALSE pour annuler la fermeture du dialogue et ainsi continuer *
*               la saisie (valeur en entrée = true).                           *
\******************************************************************************/
void __fastcall TdlgModCreCpt::FormCloseQuery( TObject* pSender,
                                               bool&    bCanClose)
{
 ASSERT( bCanClose);
 ASSERT( ( ModalResult == mrCancel) || // via btAnnuler, menu/icône système "Fermeture" ou btOk inutile
         ( ModalResult == mrOk));      // via btOk utile


 //////////////////////////////////////////////////////////////
 // Confirmation de l'annulation de la modification/création //
 //////////////////////////////////////////////////////////////
 if( ModalResult == mrCancel)
 { // L'utilisateur a cliqué sur le bouton "Annuler" ou le menu/icône système "Fermeture"
   // ou bien le bouton "Créer" a initialisé ModalResult à mrCancel car il n'y a rien à valider
   // => Confirmation d'annulation (n'aura pas lieu si fiche annulée via "Créer" car DataModified == false)
   UpdateData();
   if( DataModified)
     if( !EICQuestion( m_bModifier ? MAKEINTRESOURCE( IDS_QUEST_COMPTE_ABANDONNER_MODIFICATION)
                                   : MAKEINTRESOURCE( IDS_QUEST_COMPTE_ABANDONNER_CREATION),
                       Caption.c_str(), MB_DEFBUTTON2))
     { // L'utilisateur ne souhaite pas annuler la modification/création du compte
       // => On continue la saisie
       bCanClose = false;
     }
 }
}



/******************************************************************************\
************* TdlgModCreCpt::btOkClick() *************************************
********************************************************************************
*                                                                              *
*    Cette procédure permet de valider la création/modification du compte.     *
*                                                                              *
* Note :                                                                       *
*   Si une erreur survient pendant la création/modification du compte, la      *
* fiche n'est pas refermée.                                                    *
\******************************************************************************/
void __fastcall TdlgModCreCpt::btOkClick( TObject* pSender)
{
 ASSERT( ModalResult == mrOk);
 ////////////////////////////////////////////////
 // Lecture des valeurs du compte modifié/créé //
 ////////////////////////////////////////////////
 if( !UpdateData())
 { // Pb de saisie invalide
   // => On continue la saisie
   ModalResult = mrNone;
   return;
 }
 else if( !DataModified)
 { // Il n'y a eu aucune modification des données de la fiche
   // => On annule la fiche (elle va se fermer)
   ModalResult = mrCancel;
   return;
 }
 if (m_ptblPC->EstUnCompteAbregeExistant(edCompteAbrege->Text,m_cpt.Compte))
 {
   ActiveControl = edCompteAbrege;
   ModalResult   = mrNone;
   return;
 }

 if( m_bModifier)
 { ////////////////////////////
   // Modification du compte //
   ////////////////////////////
   ASSERT( !m_cpt.Compte.IsEmpty());
   try {
     m_ptblPC->ModifierCompte( m_cpt);
   } catch( Exception& e) {
     EICDisplayException( TAG( 10), e);
     ModalResult = mrNone;
   }
 }
 else
 { ////////////////////////////////
   // Création du nouveau compte //
   ////////////////////////////////
   ASSERT( !m_cpt.Compte.IsEmpty());

   try {
     // Création du nouveau compte
     if( !m_ptblPC->CreerCompte( m_cpt))
     { // Le compte existait déjà; il n'a pas été créé ni modifié
       // => Avertissement à l'utilisateur
       EICAttention( MAKEINTRESOURCE( IDS_WARN_NE_PEUT_CREER_COMPTE_DEJA_EXISTANT__CORRIGEZ));
       ActiveControl = edcptCompte;
       ModalResult   = mrNone;
     }
   } catch( Exception& e) {
     EICDisplayException( TAG( 10), e);
     ModalResult = mrNone;
   }
 }
  if(ModalResult == mrOk && CM_MiseAJourDesTiers != NULL)
    CM_MiseAJourDesTiers(m_cpt.Compte);
} /* TdlgModCreCpt::btOkClick() */



void __fastcall TdlgModCreCpt::edcptCompteChange(TObject *Sender)
{
  chkRANDetaille->Checked    = m_Poste.CompteEstDansPoste(edcptCompte->Text, 7400);
  chkSaisiePeriodes->Checked = m_Poste.CompteEstDansPoste(edcptCompte->Text, 7535);
}



void __fastcall TdlgModCreCpt::btParamANClick(TObject *Sender)
{
  int IDPoste = ((CBitBtn*)Sender)->Tag ? 7400 : 7535;
  m_Poste.SaisiePoste(IDPoste, false, false, false);
  if(IDPoste == 7400)
  {
    TTablePC *tbl = new TTablePC(NULL);
    tbl->Open();
    SCAN_TABLE(tbl)
    {
      tbl->Edit();
      tbl->FieldByName( TTablePC::strfPC_Lettrable)->AsBoolean = m_Poste.CompteEstDansPoste(tbl->FieldByName( TTablePC::strfPC_Compte)->AsString,IDPoste);
      tbl->Post();
    }
    tbl->Close();
  }
  edcptCompteChange(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TdlgModCreCpt::edCompteAbregeIllegalChar(CCustomEdit *pedSender, WORD &cIllegalCharCode, bool &bAccept)
{
  if( ( ( cIllegalCharCode >= 'A') && ( cIllegalCharCode <= 'Z')) ||
      ( ( cIllegalCharCode >= 'a') && ( cIllegalCharCode <= 'z')) ||
      ( ( cIllegalCharCode >= '0') && ( cIllegalCharCode <= '9')))
    bAccept = true;
}
//---------------------------------------------------------------------------

